package pl.edu.wsinf.lukaszwalczak.emailclient.view;

import java.util.List;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.ToolBar;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import pl.edu.wsinf.lukaszwalczak.emailclient.controller.MainWindowController;
import pl.edu.wsinf.lukaszwalczak.emailclient.pojo.Account;
import pl.edu.wsinf.lukaszwalczak.emailclient.pojo.Folder;
import pl.edu.wsinf.lukaszwalczak.emailclient.pojo.Mail;
import pl.edu.wsinf.lukaszwalczak.emailclient.view.component.SearchBox;

/*
 * To jest klasa będąca widokiem we wzorcu MVC i odpowiada za budowanie
 * wyglądu głównego okna. Poprzez @Inject Spring wstrzykuje automatycznie
 * referencje do kontrolera i to wlasnie na nim wykonujemy jakies operacje
 * biznesowe, w tym wypadku prostą metodę "seyHello"
 * Adnotacja @Component informuje Springa że ma zarządzać tą klasą.
 */
@Component
public class MainWindowView extends BorderPane {

    @Inject
    private MainWindowController mainWindowController;
    private MailListView center;
    private TreeView left;

    public void init() {

        // Górne menu
        MenuBar menuBar = new MenuBar();

        //Menu "Plik"
        Menu fileMenu = new Menu("Plik");

        MenuItem newMailItem = new MenuItem("Nowa wiadomosc");
        newMailItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showMailCreateWindow(null);
            }
        });

        MenuItem newContactItem = new MenuItem("Kontakty");
        newContactItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showContactListWindow();
            }
        });

        MenuItem downloadTest = new MenuItem("Pobierz wiadomości");
        downloadTest.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.downloadMails();
            }
        });

        MenuItem exitItem = new MenuItem("Zakończ");
        exitItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.exit();
            }
        });

        Menu editMenu = new Menu("Edycja");

        MenuItem newReplyItem = new MenuItem("Odpowiedź");
        newReplyItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                Mail mail = center.getSelected();
                if (mail != null) {
                    mainWindowController.showMailReplyWindow(mail);
                }
            }
        });

        MenuItem newEditItem = new MenuItem("Przekaz dalej");
        newEditItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                Mail mail = center.getSelected();
                if (mail != null) {
                    mainWindowController.showMailForwardWindow(mail);
                }
            }
        });

        MenuItem newDeleteItem = new MenuItem("Usuń");
        newDeleteItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.removeMail(center.getSelected());
            }
        });

        MenuItem newSelectItem = new MenuItem("Zaznacz wszystkie");
        newSelectItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                // mainWindowController.showEmailAccountCreateWindow();
            }
        });

        Menu FindMenu = new Menu("Szukaj");

        MenuItem newFindItem = new MenuItem("Szukaj");
        newFindItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showFindWindow();
            }
        });

        Menu EmailAcountMenu = new Menu("Konta");

        MenuItem newEmailAccountItem = new MenuItem("Dodaj konto");
        newEmailAccountItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showEmailAccountCreateWindow();
            }
        });

        MenuItem newEditAcountItem = new MenuItem("Edytuj konto");
        newEditAcountItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //mainWindowController.showAccountCreateWindow();
            }
        });

        MenuItem newDeleteAcountItem = new MenuItem("Usuń konto");
        newDeleteAcountItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //mainWindowController.showAccountCreateWindow();
            }
        });

        Menu accesoriesMenu = new Menu("Dodatki");

        MenuItem newTaskItem = new MenuItem("Zadania");
        newTaskItem.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showTaskWindow();
            }
        });


        fileMenu.getItems().add(downloadTest);
        fileMenu.getItems().add(newMailItem);
        fileMenu.getItems().add(newContactItem);
        fileMenu.getItems().add(new SeparatorMenuItem());
        fileMenu.getItems().add(exitItem);

        menuBar.getMenus().add(fileMenu);

        editMenu.getItems().add(newReplyItem);
        editMenu.getItems().add(newEditItem);
        editMenu.getItems().add(newDeleteItem);
        editMenu.getItems().add(newSelectItem);
        menuBar.getMenus().add(editMenu);

        FindMenu.getItems().add(newFindItem);
        menuBar.getMenus().add(FindMenu);

        EmailAcountMenu.getItems().add(newEmailAccountItem);
        EmailAcountMenu.getItems().add(newEditAcountItem);
        EmailAcountMenu.getItems().add(newDeleteAcountItem);
        menuBar.getMenus().add(EmailAcountMenu);

        accesoriesMenu.getItems().add(newTaskItem);
        menuBar.getMenus().add(accesoriesMenu);

        ToolBar toolbar = new ToolBar(); //toolbar powinien byc jeden, bo to jest ta belka na buttony

        Button newEmailCreateButton = ViewHelper.createButton("Nowa wiadomość", new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showMailCreateWindow(null);
            }
        }, "edit-24.png", null, 30d);
        toolbar.getItems().add(newEmailCreateButton);

        Button downloadButton = ViewHelper.createButton("Pobierz", new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.downloadMails();
            }
        }, "mail-send-receive.png", null, 30d);
        toolbar.getItems().add(downloadButton);

        Button newContactButton = ViewHelper.createButton("Kontakty", new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showContactListWindow();
            }
        }, "addressbook-24.png", null, 30d);
        toolbar.getItems().add(newContactButton);

        Button newTaskButton = ViewHelper.createButton("Zadania", new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showTaskWindow();
            }
        }, "job.png", null, 30d);
        toolbar.getItems().add(newTaskButton);

        Button newFindButton = ViewHelper.createButton("Szukaj", new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mainWindowController.showFindWindow();
            }
        }, "Find_1.png", null, 30d);
        toolbar.getItems().add(newFindButton);


        SearchBox searchbox = new SearchBox();
        HBox searchContainer = new HBox();
        searchContainer.setAlignment(Pos.CENTER_RIGHT);
        // --------------------------------------- UWAGA!!! --------------------------------------
        // Tutaj jest ustawiny odstep tego pola Szukaj od reszty przyciskow, jak bys dodał
        // Jakiś przycisk to sie to rozjedzie, dlatego wtedy musisz odpwiednio dopasować wartość setPrefWidth
        searchContainer.setPrefWidth(450);
        searchContainer.getChildren().add(searchbox);
        toolbar.getItems().add(searchContainer);

        VBox top = new VBox(0);
        top.getChildren().addAll(menuBar, toolbar);
        setTop(top);

        // Lewy panel
        left = new TreeView();
        left.setShowRoot(false);
        left.setPrefWidth(250);
        initLeft();
        setLeft(left);

        // Listener na zaznaczenie folderu
        left.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem>() {
            @Override
            public void changed(ObservableValue<? extends TreeItem> observable,
                    TreeItem oldValue, TreeItem newValue) {
                if (observable != null && observable.getValue() != null) {
                    List<Mail> mails;
                    if (observable.getValue().getParent().equals(left.getRoot())) {
                        mails = mainWindowController.getMails();
                    } else {
                        mails = mainWindowController.findMailsByFolder((String) observable.getValue().getValue());
                    }
                    center.setTableViewItems(mails);
                }
            }
        });

        // Środkowy panel
        center = new MailListView();
        center.setMainWindowController(mainWindowController);
        initCenter();
        setCenter(center);
    }

    public void initLeft() {
        TreeItem<String> treeRoot = new TreeItem<>("Root");
        List<Account> accounts = mainWindowController.getAccounts();
        for (Account account : accounts) {
            TreeItem<String> accountItem = new TreeItem<>(account.getEmailAddress());
            for (Folder folder : account.getFolders()) {
                accountItem.getChildren().add(new TreeItem<>(folder.getName()));
            }
            accountItem.setExpanded(true);
            treeRoot.getChildren().add(accountItem);
        }
        treeRoot.setExpanded(true);
        left.setRoot(treeRoot);
    }

    public void initCenter() {
        // Wypelnienie listy
        reloadMailList();
        // Listener ustawiajacy mail jako przecztany gdy sie na niego wejdzie
        center.addSelectionListener(new ChangeListener<Mail>() {
            @Override
            public void changed(ObservableValue<? extends Mail> observable,
                    Mail oldValue, Mail selected) {
                if (observable != null && observable.getValue() != null) {
                    mainWindowController.onMailSelection(selected);
                }
            }
        });
    }

    public void reloadMailList() {
        List<Mail> mails = mainWindowController.getMails();
        center.setTableViewItems(mails);
    }

    public void updateMailList() {
        center.markRead();
    }
}
